package com.iamnh.basic.dao;

import java.util.List;
import java.util.Map;

import com.iamnh.basic.model.Pager;

/**
 * 公用的Dao处理对象，这个对象中包含了Hibernate的所有基本操作和对sql的处理
 * 
 * @author BccLj
 *
 * @param <T>
 */
public interface BaseDao<T> {
	public T add(T t);

	public void update(T t);

	public void delete(int id);

	public T load(int id);

	/**
	 * 不分页查询
	 * 
	 * @param hql
	 *            查询对象的hql
	 * @param args
	 *            查询参数
	 * @return 不分页的列表
	 */
	public List<T> list(String hql, Object[] args);

	/**
	 * 不分页查询
	 * 
	 * @param hql
	 * @param arg
	 * @return
	 */
	public List<T> list(String hql, Object arg);

	/**
	 * 不分页查询
	 * 
	 * @param hql
	 * @return
	 */
	public List<T> list(String hql);

	/**
	 * 不分页查询： 基于别名查询
	 * 
	 * @param hql
	 * @param obj
	 * @return
	 */
	public List<T> listByAlias(String hql, Map<String, Object> alias);

	/**
	 * 不分页查询：别名查询和查询参数的混合
	 * 
	 * @param hql
	 * @param args
	 * @param alias
	 * @return
	 */
	public List<T> list(String hql, Object[] args, Map<String, Object> alias);

	
	public Pager<T> find(String hql, Object[] args);

	public Pager<T> find(String hql, Object arg);

	public Pager<T> find(String hql);

	public Pager<T> findByAlias(String hql, Map<String, Object> alias);

	public Pager<T> find(String hql, Object[] args, Map<String, Object> alias);
	
	/**
	 * 根据hql查询
	 * @param hql
	 * @param args
	 * @return
	 */
	public Object queryObject(String hql,Object[] args);
	
	public Object queryObject(String hql, Object arg);
	
	public Object queryObject(String hql);
	
	public Object queryObject(String hql,Object[] args,Map<String,Object> alias) ;
	
	public Object queryObjectByAlias(String hql,Map<String,Object> alias) ;
	
	/**
	 * 根据hql更新对象
	 */
	public void updateByHql(String hql,Object[] args);
	
	public void updateByHql(String hql, Object arg);
	
	public void updateByHql(String hql);
	
	/**
	 * 根据SQL查询对象，不包含关联对象
	 * @param sql 查询的sql语句
	 * @param args 查询条件
	 * @param clz 查询的实体对象
	 * @param hasEntity 该对象是否是一个hibernate所管理的实体，如果不是，需要使用setResultTransform查询
	 * @return
	 */
	public <N extends Object>List<N> listBySql(String sql,Object[] args,Class<?> clz,boolean hasEntity);
	public <N extends Object>List<N> listBySql(String sql,Object arg,Class<?> clz,boolean hasEntity);
	public <N extends Object>List<N> listBySql(String sql,Class<?> clz,boolean hasEntity);
	public <N extends Object>List<N> listBySql(String sql,Object[] args, Map<String, Object> alias,Class<?> clz,boolean hasEntity);
	public <N extends Object>List<N> listByAliasSql(String sql,Map<String, Object> alias,Class<?> clz,boolean hasEntity);
	
	public <N extends Object>Pager<N> findBySql(String sql,Object[] args,Class<?> clz,boolean hasEntity);
	public <N extends Object>Pager<N> findBySql(String sql,Object  arg,Class<?> clz,boolean hasEntity);
	public <N extends Object>Pager<N> findBySql(String sql,Class<?> clz,boolean hasEntity);
	public <N extends Object>Pager<N> findBySql(String sql,Object[] args, Map<String, Object> alias,Class<?> clz,boolean hasEntity);
	public <N extends Object>Pager<N> findByAliasSql(String sql,Map<String, Object> alias,Class<?> clz,boolean hasEntity);
	
	
	
	
}
